package annotation.category

class TestClass {

}


class UseClass {

	// 引数は呼出元のオブジェクト
	// 必ずstatic
	// 型指定でオーバーロードできる
	static b(String obj) { println obj.replace( "o", "a") }
	static b(Date obj) { println obj.toString() }
}

// このブロック中のオブジェクトにUseClassを委譲
use(UseClass) {
	str = "hoge"
	date = new Date()
	str.b()
	date.b()
}

@Category(TestClass) // TestClassにCategoryClassを委譲できるようにする宣言
class CategoryClassA {
	def printA() {
		println "aaa"
	}
}
@Category(TestClass) // TestClassにCategoryClassを委譲できるようにする宣言
class CategoryClassB {
	def printB() {
		println "bbb"
	}
}

use(CategoryClassA,CategoryClassB) {
	new TestClass().printA() // CategoryClassAを委譲したからprintAが呼べる
	new TestClass().printB() // CategoryClassBを委譲したからprintBが呼べる
}

@Mixin([CategoryClassA, CategoryClassB])
class MixinClass {}
new MixinClass().printA()
new MixinClass().printB()


